﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Studio7i.Dominio;
using System.Data.SqlClient;

namespace Studio7i.Persistencia
{
    public class ServicioDAO : IServicioDAO
    {
               
        // Métodos CRUD
        public Servicio Crear(Servicio servicioACrear)
        {
            string _Sentencia = @"INSERT INTO servicio (codServ, Descripcion, CostoHora) VALUES(@codigo, @descrip, @costoHora)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@descrip", servicioACrear.Descripcion));
                    _Comando.Parameters.Add(new SqlParameter("@costoHora", servicioACrear.CostoHora));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }
        public Servicio Obtener(int codigo)
        {
            string _Sentencia = @"SELECT codServ, descripcion, costohora FROM servicio WHERE codServ=@codigo";
            Servicio servicioCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            servicioCreado = new Servicio();
                            servicioCreado.CodServ = (int)_Resultado["codServ"];
                            servicioCreado.Descripcion = (string)_Resultado["descripcion"];
                            servicioCreado.CostoHora = (int)_Resultado["costohora"];
                            }
                    }
                }
            }
            return servicioCreado;
        }
        public Servicio Modificar(Servicio servicioAModificar)
        {
            string _Sentencia = @"UPDATE servicio SET descripcion=@descrip, costohora=@costoHora WHERE codServ=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@descrip", servicioAModificar.Descripcion));
                    _Comando.Parameters.Add(new SqlParameter("@costohora", servicioAModificar.CostoHora)); 
                    _Comando.Parameters.Add(new SqlParameter("@codigo", servicioAModificar.CodServ));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(servicioAModificar.CodServ);
        }
        public void Eliminar(Servicio servicioAEliminar)
        {
            string _Sentencia = "DELETE FROM servicio WHERE CodServ=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", servicioAEliminar.CodServ));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Servicio> ListarTodos()

        {
            string _Sentencia = @"SELECT codServ, descripcion, costohora FROM servicio";
            ICollection<Servicio> serviciosEncontrados = new List<Servicio>();
            Servicio servicioEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            servicioEncontrado = new Servicio();
                            servicioEncontrado.CodServ = (int)_Resultado["codServ"];
                            servicioEncontrado.Descripcion = (string)_Resultado["descripcion"];
                            servicioEncontrado.CostoHora = (int)_Resultado["costohora"];
                            serviciosEncontrados.Add(servicioEncontrado);
                        }
                    }
                }
            }
            return serviciosEncontrados;
        }

        public ICollection<Servicio> ListarXDescripcion(string descripcion)
        {
            string _Sentencia = "SELECT CodServ,Descripcion,CostoHora FROM Servicios WHERE Descripcion LIKE '%'+@Descripcion+'%'";
            ICollection<Servicio> serviciosEncontrados = new List<Servicio>();
            Servicio servicioEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@Descripcion", descripcion));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            servicioEncontrado = new Servicio();
                            servicioEncontrado.CodServ = _Resultado.GetInt32(0);
                            servicioEncontrado.Descripcion = (String)_Resultado["Descripcion"]; ;
                            servicioEncontrado.CostoHora = (int)_Resultado["CostoHora"];
                            serviciosEncontrados.Add(servicioEncontrado);
                        }
                    }
                }
            }
            return serviciosEncontrados;
        }

        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(codServ) FROM servicio";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }

    }
}